import _ from 'lodash';
// import Moment from 'moment';
const ISDEV = process.env.NODE_ENV === 'development';

import { all_server_config } from '../dist/server_config.js';
// all_server_config 开发下有的所有配置，服务器应该为 undefined，如果有也当没有处理
/**
 * 检查并打印缺少的初级键。
 * @param {Object} target - 目标对象，即合并后的对象。
 * @param {Object[]} sources - 源对象数组，用于检查哪些键是缺失的。
 */
function checkMissingKeys(target, sources) {
  const targetKeys = new Set(Object.keys(target));
  let r = [];
  for (const key of Object.keys(sources)) {
    if (!targetKeys.has(key)) {
      r.push(key);
    }
  }
  if (r.length > 0) {
    r.forEach((v) => {
      console.warn(`警告：当前配置项可能缺少: ${v}`);
    });
  } else {
    console.log(
      '%c [ mergeConfig 检查通过 ]-26',
      'font-size:13px; background:green; color:#fff;'
    );
  }
}

let mergeConfig = function(server_config) {
  let protocol = window.location.protocol; //获取本地协议
  let listConfig = all_server_config; //开发下有的所有配置

  // 开发专用，不暴露，也是平常修改访问各环境的指针
  let testUseCurrent = 'test'; //默认test
  // 默认配置，通常也是测试配置，
  // 开发时用于检查是否配齐必要的项目
  // 开发时可以经常改动，但需要关注后面的检查结果
  let defaultConfig = {
    host: 'http://prmanage2.chenxi18.com:8196',
  };
  let customizeConfig;
  if (ISDEV) {
    // 开发环境下用内置的开发指向
    customizeConfig = listConfig[testUseCurrent];
    // 检查合并过程中是否缺少key
    checkMissingKeys(customizeConfig, defaultConfig);
  } else {
    // 生产环境下用外部传入的指向
    customizeConfig = server_config;
  }
  let config = _.mergeWith(
    defaultConfig,
    customizeConfig,
    (objValue, srcValue, key, object, source, stack) => {
      if (key.startsWith('host') && _.isString(srcValue)) {
        if (!/^https?:/i.test(srcValue)) {
          return `${protocol}:${srcValue}`;
        }
      }
      return undefined;
    }
  );

  return config;
};

export { mergeConfig };
